﻿#pragma once

#include <learn/geom/geom_curve.h>
#include <learn/geom/geom_surface.h>

namespace xi
{

namespace geom
{

template <std::size_t N> class Geom_BasisCurve : public Geom_Curve<N>
{
    using Vec = VecT<N, double>;

  public:
    /**
     * @brief 控制点个数
     *
     * @return std::size_t
     */
    virtual std::size_t pole_num() const = 0;

    /**
     * @brief 控制点
     *
     * @param[in] i
     * @return Vec
     */
    virtual Vec pole(std::size_t i) const = 0;

    /**
     * @brief 设置控制点
     *
     * @param[in] i
     * @param[in] p
     */
    virtual void set_pole(std::size_t i, const Vec &p) = 0;
};

template <std::size_t N> class Geom_BasisSurface : public Geom_Surface<N>
{
    using Vec = VecT<N, double>;

  public:
    /**
     * @brief u 控制点个数
     *
     * @return std::size_t
     */
    virtual std::size_t u_pole_num() const = 0;

    /**
     * @brief v 控制点个数
     *
     * @return std::size_t
     */
    virtual std::size_t v_pole_num() const = 0;

    /**
     * @brief 获得控制点
     *
     * @param[in] u
     * @param[in] v
     * @return Vec
     */
    virtual Vec pole(std::size_t u, std::size_t v) const = 0;

    /**
     * @brief 设置控制点
     *
     * @param[in] u
     * @param[in] v
     * @param[in] p
     */
    virtual void set_pole(std::size_t u, std::size_t v, const Vec &p) = 0;
};

} // namespace geom

} // namespace xi
